Electronic documents are ubiquitous in today's work environment. For example, millions of people use and generate word processor documents, spreadsheet documents, and other sorts of documents every day. With the increasing importance of electronic documents, people have come to expect software applications to provide ever more powerful tools for manipulating electronic documents. For example, people have come to expect word processing applications to provide accurate grammar and spell checking tools.
However, such tools are frequently computationally intensive. Because such tools are computationally intensive, the use of such tools can result in delays that are noticeable to users. Such delays can cause user frustration and should therefore be minimized.
In recent years, the performance of computers has increased. However, much of that increase is due to the fact that individual computers can now use multiple processing units. For example, older computers only had a single processing unit and therefore could only execute one program at a time. Newer computers can have multiple processing units and therefore can execute multiple programs at the same time.
In some circumstances, multiple programs executing on multiple processing units need to interact with the same data in an electronic document. For example, if a first program were to write to some data in an electronic document while a second program was trying to read that data, the second program could read corrupted data. A typical solution to this problem is for programs to lock data in the electronic document before the programs read the data. When a program locks data, no other program can write to the data. Therefore, if another thread wants to write to the data while the data is locked, the other thread is forced to wait until the data is unlocked. Forcing the other thread to wait can result in delays that are noticeable to users.